#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>

// void Wait()
// {
//     printf("This is Wait\n");
//     exit(10);
// }

// int main()
// {
//     //Wait();
//     printf("This is main");//不带\n
//     exit(33);
//     // _exit(33);

// }

// //错误码
// int main()
// {
//     for (size_t i = 0; i < 140; i++)
//     {
//         printf("%d %s\n",i,strerror(i));
//     }

//     return 0;
// }

// int main()
// {
//     pid_t pid=fork();
//     if(pid==0)
//     {
//         printf("i am child pid:%d\n",getpid());
//         sleep(10);
//         exit(100);
//     }

//     int status=0;
//     wait(&status);
//     printf("child exit_code:%d\n",WEXITSTATUS(status));
//     printf("sig:%d\n",WTERMSIG(status));
//     WEXITSTATUS(status);//查看进程退出码
//     WIFEXITED(status);//检测进程是否收到信号退出；若正常退出，则为真，否则为假
//     return 0;
// }

// //回收
// int main()
// {
//     //WNOHANG;//宏，为1
//     pid_t pid=fork();
//     if(pid==0)
//     {
//         // child
//         int cnt = 3;
//         while (cnt--)
//         {
//             printf("I am child pid:%d ppid:%d\n", getpid(), getppid());
//             sleep(1);
//             if (cnt == 0)
//             {
//                 printf("child over\n");
//             }
//         }
//         exit(99);
//     }

//     // pid_t rid=wait(NULL);
//     // printf("father wait success rid:%d\n",rid);

//     // father
//     int status=0;
//     pid_t rid=waitpid(pid,&status,0);
//     int cnt = 5;
//     while (cnt--)
//     {
//         printf("I am father pid:%d\n", getpid());
//         sleep(1);
//     }

   
//     //if(rid>0 && (status&0x7f)==0)//低7位
//     if(rid>0 && WIFEXITED(status))//若为正常终止子进程返回的状态，则为真。（查看进程是否是正常退出,不能看出是几号信号）
//     {
//         //printf("wait success:%d exit_code:%d\n",rid,(status>>8)&0xff);
//         printf("wait success:%d exit_code:%d\n",rid,WEXITSTATUS(status));
//     }
//     else
//     {
//         //printf("kill by sig:%d\n",status&0x7f);
//         printf("kill by sig:%d\n",WIFEXITED(status));
//     }
//     //sleep(5);
//     return 0;
// }

// waitpid

int main()
{
    pid_t pid = fork();
    if (pid == 0)
    {
        // child
        int cnt = 5;
        while (cnt)
        {
            printf("I am child pid:%d ppid:%d\n", getpid(), getppid());
            sleep(1);
            cnt--;
            if (cnt == 0)
            {
                printf("child over\n");
            }
        }
        exit(1);
    }
    //sleep(5);//配合监控
    // father
    // pid_t rid = wait(NULL); // 父进程会一直等待，直到回收子进程才继续执行执行流
    //WNOHANG;
    //WUNTRACED;
    //pid_t rid=waitpid(pid,NULL,0);//阻塞
    //pid_t rid = waitpid(pid, NULL, WNOHANG);//非阻塞轮询
    int status=0;
    pid_t rid;
    while(1)
    {
        rid = waitpid(pid, &status, WNOHANG);//非阻塞轮询
        if(rid==0)
        {
            printf("father do other things...\n");
			sleep(1);
        }
        else if (rid > 0)
        {
            if (WIFEXITED(status))
            {
                printf("wait success:%d exit_code:%d\n", rid, WEXITSTATUS(status));
            }
            else
            {
                printf("kill by sig:%d\n", WTERMSIG(status));//((status) & 0x7f)
            }
            break;
        }
        else
        {
            printf("waitpid error...\n");
            break;
        }
    }
    printf("father over\n");
    //sleep(5);

    return 0;
}


